﻿using System;
using System.Collections.Generic;
using System.Text;
using WeShare.WeiXin.Common;
using WeShare.WeiXin.Common.EnumKey;

namespace WeShare.WeiXin.Mp.JsSdk.Entity
{
    /// <summary>
    /// 批量添加卡券接口所需参数
    /// </summary>
    public class CardExt
    {
        private CardExt()
        {
        }
        /// <summary>
        /// 创建批量添加卡券的实体
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="cardId"></param>
        /// <param name="code">指定的卡券code码，只能被领一次。自定义code模式的卡券必须填写，非自定义code和预存code模式的卡券不必填写。详情见： 是否自定义code码</param>
        /// <param name="openid">	指定领取者的openid，只有该用户能领取。bind_openid字段为true的卡券必须填写，bind_openid字段为false不必填写。</param>
        /// <param name="geTime">卡券在第三方系统的实际领取时间</param>
        /// <param name="outerStr">领取渠道参数，用于标识本次领取的渠道值。</param>
        public CardExt(string appId, string cardId, string code, string openid="", DateTime? geTime = null, string outerStr = "")
        {
            this.code = code;
            this.openid = openid;
            if (geTime != null)
            {
                fixed_begintimestamp = Utils.ConvertDateTimeInt(geTime.Value).ToString();
            }
            this.outer_str = outerStr;
            var ticket = ApiTicket.GetValue(TicketType.wx_card, appId);
            var arr = new string[]
            {
                ticket,timestamp.ToString(),
                cardId,code,openid,nonce_str
            };
            //字典排序
            Array.Sort(arr);
            //使用URL键值对的格式拼接成字符串
            var temp = string.Join("", arr);
            this.signature = Utils.Sha1(temp);
        }

        /// <summary>
        /// 指定的卡券code码，只能被领一次。自定义code模式的卡券必须填写，非自定义code和预存code模式的卡券不必填写。详情见： 是否自定义code码
        /// </summary>
        public string code { get; set; }
        /// <summary>
        /// 指定领取者的openid，只有该用户能领取。bind_openid字段为true的卡券必须填写，bind_openid字段为false不必填写。
        /// </summary>
        public string openid { get; set; }

        /// <summary>
        /// 时间戳，商户生成从1970年1月1日00:00:00至今的秒数,即当前的时间,且最终需要转换为字符串形式;由商户生成后传入,不同添加请求的时间戳须动态生成，若重复将会导致领取失败！。
        /// </summary>
        public long timestamp { get; set; } = Utils.GetTimeStamp();

        /// <summary>
        /// 随机字符串，由开发者设置传入， 加强安全性（若不填写可能被重放请求） 。随机字符串，不长于32位。推荐使用大小写字母和数字，不同添加请求的nonce须动态生成，若重复将会导致领取失败。
        /// </summary>
        public string nonce_str { get; set; } = Utils.GetTimeStamp().ToString();
        /// <summary>
        /// 	卡券在第三方系统的实际领取时间，为东八区时间戳（UTC+8,精确到秒）。当卡券的有效期类型为 DAT E_TYPE_FIX_TERM时专用，标识卡券的实际生效时间，用于解决商户系统内起始时间和领取时间不同步的问题。
        /// </summary>
        public string fixed_begintimestamp { get; set; }
        /// <summary>
        /// 领取渠道参数，用于标识本次领取的渠道值。
        /// </summary>
        public string outer_str { get; set; }
        /// <summary>
        /// 签名，商户将接口列表中的参数按照指定方式进行签名,签名方式使用SHA1,具体签名方案参见下文;由商户按照规范签名后传入。
        /// </summary>
        public string signature { get; set; }
    }
}
